メインコンテンツへスキップ
  1. ブログ投稿/

Python - pandasデータ統合 (concat, join, merge)

·3 分

この投稿は、pandasライブラリを活用して複数のデータを一つに統合する方法について説明するために作成されました。

データを統合する方法にはいくつかありますが、今回扱うのは concat, join, mergeです。

説明する前に、例として2つのデータフレームを作成しましょう。

>>> import pandas as pd 

>>> df1 = pd.DataFrame({
    'Class1' : [95, 92, 98, 100],
    'Class2' : [91, 93, 97, 99]
})

>>> df2 = pd.DataFrame({
    'Class1' : [87, 89],
    'Class2' : [85, 90]
})

d1の出力値:

Class1 Class2
0 87 85
1 89 90

d2の出力値:

Class1 Class2
0 95 91
1 92 93
2 98 97
3 100 99

1. concat #

pandasライブラリの concat 関数はデータフレームを連結するために使用されます。この関数は複数のデータフレームを行または列方向に連結することができます。

df1とdf2をresultに連結しましょう。

>>> result = pd.concat([df1, df2])
>>> result
Class1 Class2
0 95 91.0
1 92 93.0
2 98 97.0
3 100 99.0
4 87 85.0
5 89 90.0
6 96 NaN
7 83 NaN

**pd.concat([df1, df2])**は df1と df2を行の方向に連結します。つまり、2つのデータフレームが上下に接続されます。

次に、Class1列のみを持つd3をresultに統合しましょう。

>>> df3 = pd.DataFrame({
    'Class1' : [96, 83]
})

>>> pd.concat([result, df3], ignore_index=True)
Class1 Class2
0 95 91.0
1 92 93.0
2 98 97.0
3 100 99.0
4 87 85.0
5 89 90.0
6 96 NaN
7 83 NaN

d3データは’Class2’列を持っていないため、空白値が出力されます。

2. join #

pandasライブラリのj join メソッドは、2つのデータフレームを特定の列を基準に結合するために使用されます。一般的にSQLの JOIN 操作と同様の役割を果たします。 concatとは異なり、 joinは横方向に統合されます。

>>> df4 = pd.DataFrame({
    'Class3' : [93, 91, 95, 98]
})

>>> df1.join(df4)
Class1 Class2 Class3
a 95 91 93
b 92 93 91
c 98 97 95
d 100 99 98

次のようにインデックスを任意に設定して出力することも可能です。

>>> index_label = ['a','b','c','d']
>>> df1a = pd.DataFrame({'Class1': [95, 92, 98, 100],
                    'Class2': [91, 93, 97, 99]}, index= index_label)
>>> df4a = pd.DataFrame({'Class3': [93, 91, 95, 98]}, index=index_label)

>>> df1a.join(df4a)
Class1 Class2 Class3
a 95 91 93
b 92 93 91
c 98 97 95
d 100 99 98

3. merge #

pandasライブラリのmerge関数は、2つのデータフレームを特定の列を基準にマージ(統合)するために使用されます。merge関数を使用すると、データフレーム間で共通の列を基準に結合することができます。

>>> df_A_B = pd.DataFrame({'販売月': ['1月', '2月', '3月', '4月'],
                       '製品A': [100, 150, 200, 130],
                       '製品B': [90, 110, 140, 170]})

>>> df_C_D = pd.DataFrame({'販売月': ['1月', '2月', '3月', '4月'],
                       '製品C': [112, 141, 203, 134],
                       '製品D': [90, 110, 140, 170]})

df_A_B

販売月 製品A 製品B
0 1月 100 90
1 2月 150 110
2 3月 200 140
3 4月 130 170

df_C_D

販売月 製品C 製品D
0 1月 112 90
1 2月 141 110
2 3月 203 140
3 4月 134 170

mergeを使って *‘販売月’*列を基準に2つのデータフレームをマージします。結果として ‘販売月’  列を基準に2つのデータフレームが結合され、共通の列を中心にデータが整理されます。

>>> df_A_B.merge(df_C_D)
販売月 製品A 製品B 製品C 製品D
0 1月 100 90 112 90
1 2月 150 110 141 110
2 3月 200 140 203 140
3 4月 130 170 134 170

mergeメソッドを使用して2つのデータフレームを結合する4つの異なる方法を実装してみましょう。

>>> df_left = pd.DataFrame({'key':['A','B','C'], 'left': [1, 2, 3]})
>>> df_right = pd.DataFrame({'key':['A','B','D'], 'right': [4, 5, 6]})

1.

>>> df_left.merge(df_right, how='left', on = 'key')
key left right
0 A 1 4.0
1 B 2 5.0
2 C 3 NaN

‘key’列を基準にdf_leftとdf_rightを左結合(left join)します。左結合は左データフレーム(df_left)の全ての行を保持し、右データフレーム(df_right)の該当するキー値がある行を追加します。該当するキー値が右データフレームにない場合はNaNで埋められます。

2.

>>> df_left.merge(df_right, how='right', on = 'key')
key left right
0 A 1.0 4
1 B 2.0 5
2 D NaN 6

‘key’列を基準にdf_leftとdf_rightを右結合(right join)します。右結合は右データフレーム(df_right)の全ての行を保持し、左データフレーム(df_left)の該当するキー値がある行を追加します。該当するキー値が左データフレームにない場合はNaNで埋められます。

3.

>>> df_left.merge(df_right, how='outer', on = 'key')
key left right
0 A 1.0 4.0
1 B 2.0 5.0
2 D 3.0 NaN
3 D NaN 6.0

‘key’列を基準にdf_leftとdf_rightを外部結合(outer join)します。外部結合は両方のデータフレームの全ての行を含み、一方のデータフレームにのみ該当する場合はNaNで埋められます。

4.

>>> df_left.merge(df_right, how='inner', on = 'key')
key left right
0 A 1 4
1 B 2 5

‘key’列を基準にdf_leftとdf_rightを内部結合(inner join)します。内部結合は両方のデータフレームに共通して存在する行のみを含みます。つまり、両方のデータフレームで同じ’key’値を持つ行を結合します。